home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmigcc5.zip / RSX / SOURCE / ASM16 / COPY32.ASM < prev    next >
Assembly Source File  |  1994-12-12  |  6KB  |  360 lines

  1. ;
  2. ; COPY32.ASM (c) Rainer Schnitker 92,93
  3. ;
  4.  
  5. ;
  6. ; copy to or from 32bit segments
  7. ;
  8.  
  9.     .386p
  10.  
  11. _TEXT segment dword public 'CODE' use16
  12.     assume cs:_TEXT
  13.  
  14.  
  15.     ;
  16.     ; void store32(WORD ds,DWORD offset,DWORD value)
  17.     ;
  18. public _store32
  19. _store32 proc near
  20.     ; stack: 4 = WORD ds32, 6 = DWORD off32, 10 = DWORD value
  21.     push    bp
  22.     mov    bp,sp
  23.     push    ds
  24.     push    ebx
  25.     push    eax
  26.     mov    ax,word ptr [bp+4]        ; get user ds
  27.     mov    ds,ax
  28.     mov    eax,dword ptr [bp+6]        ; get user offset
  29.     mov    ebx,dword ptr [bp+10]        ; get value
  30.     mov    [eax],ebx
  31.     pop    eax
  32.     pop    ebx
  33.     pop    ds
  34.     leave
  35.     ret
  36. _store32 endp
  37.  
  38.     ;
  39.     ; void put_user_byte(WORD ds,DWORD offset,DWORD value)
  40.     ;
  41. public _put_user_byte
  42. _put_user_byte proc near
  43.     ; stack: 4 = WORD ds32, 6 = DWORD off32, 10 = DWORD value
  44.     push    bp
  45.     mov    bp,sp
  46.     push    ds
  47.     push    ebx
  48.     push    eax
  49.     mov    ax,word ptr [bp+4]        ; get user ds
  50.     mov    ds,ax
  51.     mov    eax, dword ptr [bp+6]        ; get user offset
  52.     mov    bl, byte ptr [bp+10]        ; get value
  53.     mov    [eax], bl
  54.     pop    eax
  55.     pop    ebx
  56.     pop    ds
  57.     leave
  58.     ret
  59. _put_user_byte endp
  60.  
  61.  
  62.     ;
  63.     ; DWORD read32(WORD ds,DWORD offset)
  64.     ;
  65. public _read32
  66. _read32 proc near
  67.     ; stack: 4 = WORD ds32, 6 = DWORD off32
  68.     push    bp
  69.     mov    bp,sp
  70.     push    ds
  71.     mov    ax,word ptr [bp+4]        ; get user ds
  72.     mov    ds,ax
  73.     mov    eax,dword ptr [bp+6]        ; get user offset
  74.     mov    edx,[eax]
  75.     movzx    eax,dx                ; convert result
  76.     shr    edx,16                ; in DX:AX
  77.     pop    ds
  78.     leave
  79.     ret
  80. _read32 endp
  81.  
  82.  
  83.     ;
  84.     ; void bzero32(WORD ds,DWORD offset,DWORD size)
  85.     ;
  86. public _bzero32
  87. _bzero32 proc near
  88.     ; stack: 4 = WORD ds32, 6 = DWORD off32, 10 = DWORD bytes
  89.     push    bp
  90.     mov    bp,sp
  91.     push    es
  92.     push    esi
  93.     push    edi
  94.     push    ecx
  95.  
  96.     mov    ax,word ptr [bp+4]        ; get user ds
  97.     mov    es,ax
  98.     mov    edi,dword ptr [bp+6]        ; get user offset
  99.     mov    ecx,dword ptr [bp+10]        ; get size
  100.     xor    eax,eax             ; store 0
  101.     cld
  102.  
  103.     REP    STOS    BYTE PTR ES:[EDI]
  104.  
  105.     pop    ecx
  106.     pop    edi
  107.     pop    esi
  108.     pop    es
  109.     leave
  110.     ret
  111. _bzero32 endp
  112.  
  113.  
  114.     ;
  115.     ; void cpy16_32(WORD ds,DWORD off,void *off16,DWORD size)
  116.     ;
  117. public _cpy16_32
  118. _cpy16_32 proc near
  119.     ; stack: 4 = ds32, 6 = DWORD off32, 10 = p16, 12 = DWORD bytes
  120.     push    bp
  121.     mov    bp,sp
  122.     push    es
  123.     push    esi
  124.     push    edi
  125.     push    ecx
  126.  
  127.     mov    ax,word ptr [bp+4]        ; get user ds
  128.     mov    es,ax                ; dest = ES:EDI
  129.     mov    edi,dword ptr [bp+6]        ; get user 32bit offset
  130.     movzx    esi, word ptr [bp+10]        ; source offset (DS:SI)
  131.     mov    ecx,dword ptr [bp+12]        ; get size
  132.  
  133.     push    ecx
  134.     shr    ecx,2
  135.     cld
  136.     jecxz    @byte_cpy16_32
  137.     REP    MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]
  138.  
  139. align 4
  140. @byte_cpy16_32:
  141.     pop    ecx
  142.     and    ecx, dword ptr 3
  143.     jecxz    @end_cpy16_32
  144.     REP    MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]
  145.  
  146. align 4
  147. @end_cpy16_32:
  148.     pop    ecx
  149.     pop    edi
  150.     pop    esi
  151.     pop    es
  152.     leave
  153.     ret
  154. _cpy16_32 endp
  155.  
  156.  
  157.     ;
  158.     ; void cpy32_16(WORD ds,DWORD off,WORD ds16,WORD,off16,DWORD size)
  159.     ;
  160. public _cpy32_16
  161.     ; stack: 4 = WORD ds32, 6 = DWORD off32, 10 = p16, 12 = DWORD bytes
  162. _cpy32_16 proc near
  163.     push    bp
  164.     mov    bp,sp
  165.     push    ds
  166.     push    es
  167.     push    esi
  168.     push    edi
  169.     push    ecx
  170.  
  171.     mov    ax,ds
  172.     mov    es,ax                ; dest segment
  173.     movzx    edi, word ptr [bp+10]        ; get dest 16bit offset
  174.     mov    ax,word ptr [bp+4]        ; get user ds
  175.     mov    ds,ax                ; source = DS:ESI
  176.     mov    esi,dword ptr [bp+6]        ; get user 32bit offset
  177.     mov    ecx,[bp+12]            ; get size
  178.     cld
  179.  
  180.     push    ecx
  181.     shr    ecx,2
  182.     jecxz    @byte_cpy32_16
  183.     REP    MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]
  184.  
  185. align 4
  186. @byte_cpy32_16:
  187.     pop    ecx
  188.     and    ecx, dword ptr 3
  189.     jecxz    @end_cpy32_16
  190.     REP    MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]
  191.  
  192. align 4
  193. @end_cpy32_16:
  194.     pop    ecx
  195.     pop    edi
  196.     pop    esi
  197.     pop    es
  198.     pop    ds
  199.     leave
  200.     ret
  201. _cpy32_16 endp
  202.  
  203.  
  204.     ;
  205.     ; void strcpy16_32(WORD ds,DWORD off,WORD ds16,WORD,off16)
  206.     ;
  207. public _strcpy16_32
  208. _strcpy16_32 proc near
  209.     ; stack: 4 = WORD ds32, 6 = DWORD off32 , 10=word p16
  210.     push    bp
  211.     mov    bp,sp
  212.     push    es
  213.     push    esi
  214.     push    edi
  215.  
  216.     mov    ax,word ptr [bp+4]        ; get user ds
  217.     mov    es,ax                ; dest = ES:EDI
  218.     mov    edi,dword ptr [bp+6]        ; get user 32bit offset
  219.     movzx    esi,word ptr [bp+10]        ; source offset (DS:SI)
  220.     cld
  221.  
  222. align 4
  223. @cp16_32:
  224.     LODS    BYTE PTR DS:[ESI]
  225.     STOS    BYTE PTR ES:[EDI]
  226.     or    al,al
  227.     jnz    @cp16_32
  228.  
  229.     pop    edi
  230.     pop    esi
  231.     pop    es
  232.     leave
  233.     ret
  234. _strcpy16_32 endp
  235.  
  236.  
  237.     ;
  238.     ; void strcpy32_16(WORD ds,DWORD off,WORD ds16,WORD,off16)
  239.     ;
  240. public _strcpy32_16
  241. _strcpy32_16 proc near
  242.     ; stack: 4 = WORD ds32, 6 = DWORD off32 ,10 = WORD p16
  243.     push    bp
  244.     mov    bp,sp
  245.     push    ds
  246.     push    es
  247.     push    esi
  248.     push    edi
  249.  
  250.     mov    ax,ds
  251.     mov    es,ax                ; dest segment
  252.     movzx    edi, word ptr [bp+10]        ; get dest offset
  253.     mov    ax,word ptr [bp+4]        ; get user ds
  254.     mov    ds,ax                ; source = DS:ESI
  255.     mov    esi,dword ptr [bp+6]        ; get user offset
  256.     cld
  257.  
  258. align 4
  259. @cp32_16:
  260.     LODS    BYTE PTR DS:[ESI]
  261.     STOS    BYTE PTR ES:[EDI]
  262.     or    al,al
  263.     jnz    @cp32_16
  264.  
  265.     pop    edi
  266.     pop    esi
  267.     pop    es
  268.     pop    ds
  269.     leave
  270.     ret
  271. _strcpy32_16 endp
  272.  
  273.     ;
  274.     ; void getstr(WORD ds,DWORD off,WORD ds16,WORD,off16,BYTE c)
  275.     ;
  276. public _getstr32_16
  277. _getstr32_16 proc near
  278.     ; stack: 4 = WORD ds32, 6 = DWORD off32 ,10 = WORD p16, 12 = BYTE c
  279.     push    bp
  280.     mov    bp,sp
  281.     push    ds
  282.     push    es
  283.     push    esi
  284.     push    edi
  285.  
  286.     mov    ax,ds
  287.     mov    es,ax                ; dest segment
  288.     movzx    edi, word ptr [bp+10]        ; get dest offset
  289.     mov    ax,word ptr [bp+4]        ; get user ds
  290.     mov    ds,ax                ; source = DS:ESI
  291.     mov    esi,dword ptr [bp+6]        ; get user offset
  292.     mov    cl, byte ptr [bp+12]        ; get delim
  293.     cld
  294.  
  295. align 4
  296. @get32_16:
  297.     LODS    BYTE PTR DS:[ESI]
  298.     STOS    BYTE PTR ES:[EDI]
  299.     xor    al,cl
  300.     jnz    @get32_16
  301.  
  302.     pop    edi
  303.     pop    esi
  304.     pop    es
  305.     pop    ds
  306.     leave
  307.     ret
  308. _getstr32_16 endp
  309.  
  310.     ;
  311.     ; void cpy32_32(WORD s_ds,DWORD s_off,WORD d_ds,DWORD d_off,DWORD size)
  312.     ;
  313. public _cpy32_32
  314. _cpy32_32 proc near
  315.     ; stack: 4 = source_ds32, 6 = DWORD source_off32
  316.     ;    10 = ds32, 12= DWORD off32, 16= DWORD bytes
  317.     push    bp
  318.     mov    bp,sp
  319.     push    ds
  320.     push    es
  321.     push    esi
  322.     push    edi
  323.     mov    ax,word ptr [bp+4]        ; get source dataseg
  324.     mov    ds,ax                ; source = DS:ESI
  325.     mov    esi,dword ptr [bp+6]        ; get source offset
  326.  
  327.     mov    ax,word ptr [bp+10]        ; get dest dataseg
  328.     mov    es,ax                ; dest = ES:EDI
  329.     mov    edi,dword ptr [bp+12]        ; get dest offset
  330.  
  331.     mov    ecx,dword ptr [bp+16]        ; get size
  332.     cld
  333.  
  334.     push    ecx
  335.     shr    ecx,dword ptr 00000002H
  336.     jecxz    @byte_cpy32_32
  337.     REP    MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]
  338.  
  339. align 4
  340. @byte_cpy32_32:
  341.     pop    ecx
  342.     and    ecx,dword ptr 00000003H
  343.     jecxz    @end_cpy32_32
  344.     REP    MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]
  345.  
  346. align 4
  347. @end_cpy32_32:
  348.     pop    edi
  349.     pop    esi
  350.     pop    es
  351.     pop    ds
  352.     leave
  353.     ret
  354. _cpy32_32 endp
  355.  
  356.  
  357. _TEXT ends
  358.  
  359.       end
  360.